perm filename TRNS.F4[MSS,LCS] blob sn#264025 filedate 1977-02-15 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	 	DIMENSION ITX(18),JST(128),RN(200)
C00020 ENDMK
C⊗;
 	DIMENSION ITX(18),JST(128),RN(200)
	DATA ITX/'EF-','E-','F','GF','G','AF','A',
	1 'BF','B',0,'DF','D','EF','E','F+','BBF','O-','O+'/
C  O- = OCTAVE DOWN, O+ =OCTAVE UP.   OR 1/2 STEP NUMS. MAY BE USED.
	COMMON  /XXX/IRV,ITRANS,JPG
	COMMON /PX/KPN(250) /Q/Q(2000)
	EQUIVALENCE (ITEM,JST(18)),(ITOT,JST(19))
1000	FORMAT(' TYPE FILE NAME.EXT   ',$)
2200	FORMAT(A5,A1,A3)
2201	FORMAT(1XA5,'.',A3)
400	FORMAT(' OUTPUT NAME.EXT   ',$)
6	FORMAT(' WRITE OVER ',A5,'.',A3,'?  ',$)
8	FORMAT(A1)
304	FORMAT(' TRANSP.= '$)
306	FORMAT(I)
	SIG=-99
	XSIG=0
300	TYPE 1000
	ACCEPT 2200,NM,XIN,XIN
	NX=NM+256
2001	TYPE 304
	ACCEPT 2101,ITRANS
	IF(ITRANS.GT.-20)GO TO 1101
2101	FORMAT(A3)
C  NEXT FOR LETTER NAMES 
	DO 3101 K=1,18
3101	IF(ITRANS.EQ.ITX(K))GO TO 4101
5101	TYPE 240
	GO TO 2001
240	FORMAT(' THIS TRANSP NOT OFFERED')
1101	REREAD 306,ITRANS
	IF(ITRANS.EQ.0)GO TO 300
	ITRANS=10-ITRANS
	IF(ITRANS.EQ.22)ITRANS=17
C FOR DOWN OCT.
	IF(ITRANS.GT.0)GO TO 700
	IF(ITRANS.EQ.-2)ITRANS=18
C  -2 NOW = UP OCT.
	GO TO 700
4101	ITRANS=K
	
700	TYPE 400
	ACCEPT 2200,NOUT,K,XOUT
	IF(NOUT.NE.' ')GO TO 5
	NOUT='AAAAA'
	XOUT='TST'
C DEFAULT NAMES
5	IF(LOOKX(NOUT,XOUT).GE.0)GO TO 11
	TYPE 6,NOUT,XOUT
	ACCEPT 8,K
	IF(K.EQ.'N')GO TO 700
11	JOUT=NOUT+256
10	IF(LOOKX(NM,XIN))GO TO 9
	NM=NX
	NX=NX+256
C  WILL READ UP TO 52 FILES.
	NOUT=JOUT
	JOUT=JOUT+256
	IF(LOOKX(NM,XIN).GE.0)CALL EXIT

9	CALL GETEXT(NM,XIN)
	CALL EXTIN(JST,128)
	CALL EXTIN(KPN,ITEM)
	CALL EXTIN(Q,ITOT)
	TYPE 2201,NM,XIN
	ITEM=ITEM-2

C  NEXT SORTS INTO LEFT-TO-RIGHT
	KL=1
	JPG=ITEM-1
333	DO 33 K=KL,JPG 
	IF(CODEN(KPN,K,Q,J).GT.6)GO TO 33
	A=Q(J+3)
	DO 33 J=K+1,JPG
	IF(CODEN(KPN,J,Q,L).GT.6)GO TO 33
	IF(A.LE.Q(L+3))GO TO 33
	CALL EXCH(KPN(J),KPN(K))
	KL=J-1
	GO TO 333
33	CONTINUE

C NEXT FIND HOW MANY STAVES.  KSIG?
	RS=0
	DO 32 K=1,ITEM
	R=CODEN(KPN,K,Q,J)
	IF(R.GT.2)GO TO 32
	IF(Q(J+2).GT.RS)RS=Q(J+2)
32	IF(R.EQ.17)SIG=0
	JPG=RS+1
	JITEM=ITEM

	IOCT=0
	KW=0
C  FOUND KSIG, SO DON'T DO THE REST
	IF(XSIG.NE.0)GO TO 199 
	RT=0
	GO TO(94,94,93,92,92, 91,91,90,90,90, 97,97,96,96,95,
	1 102,99,98),ITRANS
C  EEb,EE,F↓,F#↓,G,  Ab,A,Bb,B,DMY,  Db,D,Eb,E,F  BBb, 8↓, 8↑
	RETURN
102	RT=8
	GO TO 41
95	RT=RT-1
96	RT=RT-1
97	RT=RT-1
	GO TO 41
98	RT=7
	GO TO 45
99	RT=-7
45	IOCT=-1
	GO TO 199
94	RT=RT+1
93	RT=RT+1
92	RT=RT+1
91	RT=RT+1
90	RT=RT+1
41	NSIG=-1
CC	IF(RSIG(KW).NE.99)GO TO 699
C  ASSUMES KSIG DESIRED IF ONE THERE ALREADY.
	IF(SIG.EQ.0)GO TO 699
	TYPE 42
42	FORMAT(' ADD KEY SIG? -- ',$)
	ACCEPT 8,XSIG
299	IF(XSIG.NE.'Y')GO TO 199
699	NSIG=0
	XSIG=99

C  ***** NEXT FOR KEY SIG. ********
399	IADD=0
C  ADD= ADD OR SUBTR. # OR b  FROM KSIG.
	GO TO (73,78,75,76,81, 72,79,74,77,399,
	1 71,80,73,78,75, 74),ITRANS
C  EEb,EE,F↓,F#↓,G,  Ab,A,Bb,B,DMY,  Db,D,Eb,E,F  BBb, 8↓, 8↑
71	IADD=IADD+1
72	IADD=IADD+1
73	IADD=IADD+1
74	IADD=IADD+1
75	IADD=IADD+1
C 75=F, 81=G, 79=A, 73=E FLAT, 74=Bb, 80=D
CC	GO TO 2002
	GO TO 199
76	IADD=IADD-1
77	IADD=IADD-1
78	IADD=IADD-1
79	IADD=IADD-1
80	IADD=IADD-1
81	IADD=IADD-1
CC2002	K=0
CC2003	R=0
CC	RZ=RSIG(K)
CC	IF(RZ.NE.-99)R=RZ
CC	R=IADD+R
CC	IF(R.EQ.0)GO TO 799
CC	IF(IPG.GT.0)GO TO 799
C SKIP IF TRNSP ONLY.
CC	IF(RZ.EQ.-99)CALL STAFF
CC	1 (4.,17.,4.0*RSTJ2,0,R,CLEF,0,0,0,0,0,0)
CC799	RSIG(K)=R
CC	K=K+1
CC	IF(K.LT.JPG)GO TO 2003
199	K=1
	CLEF=-1
	RSIG=0
	SLUR=0
	PRX=99
	MS=1
	SN=KW
599	X=CODEN(KPN,K,Q,J)
	IF(X.NE.4)GO TO 2
	BAR=-1
	MS=1  
	GO TO 100
2	IF(Q(J+2).NE.SN)GO TO 100
CHECK FOR STAFF NUM.
	IF(X.EQ.1)GO TO 1
20	IF(X.NE.17)GO TO 12
	RSIG=-1
	R=Q(J+5)
C KSIG NUM.
	X=R+IADD
CHANGED TO X
	IF(X.NE.0)GO TO 23
CC	X=100
CHANGE KSIG TO NATURALS
CC	IF(R)X=-X
CC	X=R+X
	M=Q(J)+3
C THIS WILL DELETE KSIG
	ITOT=ITOT-M
	KL=ITOT-J
	CALL RLOOP(Q(J),Q(J+M),KL)
	DO 334 J=K,JITEM
334	KPN(J)=KPN(J+1)-M
	JITEM=JITEM-1
	K=K-1
	GO TO 100
23	Q(J+5)=X
	NSIG=0
12	IF(X.EQ.5)GO TO 120
	IF(X.NE.3)GO TO 26
	IF(CLEF.GE.0)GO TO 100
C FINDS ONLY 1 CLEF PER STAFF
	CLEF=Q(J+5)
	IF(Q(J).LT.3)CLEF=0
	GO TO 100
26	IF(X.NE.6)GO TO 100
120	IF(RT.NE.8)GO TO 121
	IF(CLEF.EQ.1)RT=-4
121	Q(J+4)=Q(J+4)+RT
	Q(J+5)=Q(J+5)+RT
	IF(X.EQ.5)SLUR=Q(J+6)
C  SAVES RIGHT POS. OF SLUR
	GO TO 100
C  FOR BEAMS AND SLURS

1	R=Q(J+4)
	XRT=RT
	IF(IOCT)GO TO 4
C  IOCT=-1 FOR OCT+ OR OCT- 
	RX=AMOD(R,100.0)
	RZ=AMOD(RX,7.0)
C  THE NOTE NUM
	IF(RZ)RZ=RZ+7
C  PUTS IT IN 0-6 RANGE FOR ACCI CHANGE SECTION.
	R5=Q(J+5)
	A=AMOD(R5,10.0)
C  THE ACCI
	RN(MS)=A
	RN(MS+1)=RX
C  SAVE FOR REPEATS
	MS=MS+2
	CHNAT=3
	IF(MS.LT.4)GO TO 205
CC	IF(MS.LT.203)GO TO 205
	N=MS-3
200	IF(RX.NE.RN(N))GO TO 201
	IF(A.EQ.0)GO TO 4
C  NOW WE'VE FOUND THE SAME NOTE WITH NO ACCI IN SAME MEAS.
	GO TO 203
CC204	IF(CLEF.EQ.1)RT=RT-12
C  FOR BSCLAR
CC	IF(A.NE.0)GO TO 203
CC	GO TO 4
201	N=N-2
	IF(N.GE.1)GO TO 200
CC	IF(N.GE.200)GO TO 200
205	IF(NSIG)CHNAT=0
203	ADD=A
C  THE CHANGE IN ACCI
	IF(PRX.NE.RX)GO TO 44
C IF PREV ACCI AND NT ARE SAME, SKIP OVER.
	IF(A.NE.0)GO TO 44
C NOW SAME NOTE, NO ACCI
	IF(ABS(SLUR-Q(J+3)).GT.3)GO TO 44
C  FOUND CONNECTING TIE
CC	IF(BAR.EQ.0)GO TO 204
C THIS ↑↑↑↑ ALWAYS PUTS ACCI AFTER A BAR -- EVEN WITH TIE------
C OR SET MS BACK TO 200 WHEN TIE IS PRESENT.  THIS WILL
CAUSE LATER SAME NOTE TO HAVE ACCI (I HOPE.)
	IF(BAR)MS=1  
	IF(A.NE.0)GO TO 203
	GO TO 4
44	IF(NSIG)GO TO 440
	IF(ITRANS.GE.16)GO TO 69
	IF(A.EQ.0)GO TO 4
C  ONLY CHECKS ON NOTES WITH NO ACCI

440	IF(CLEF.NE.1)GO TO 69
	RZ=RZ-5
	IF(RZ)RZ=RZ+7
69	GO TO (63,52,53,54,55, 56,57,58,59,440, 61,62,63,52,53
	1 ,64),ITRANS
C  EEb,EE,F↓,F#↓,G,  Ab,A,Bb,B,DMY,  Db,D,Eb,E,F  BBb
54	IF(RZ.EQ.3)GO TO 101
59	IF(RZ.EQ.6)GO TO 101
52	IF(RZ.EQ.2)GO TO 101
57	IF(RZ.EQ.5)GO TO 101
C  FOR "A".  FINDS C,F AND G.
62	IF(RZ.EQ.1)GO TO 101
55	IF(RZ.EQ.4)GO TO 101
C  "G"   F→Bb, F#→B NAT.
	GO TO 4
61	IF(RZ.EQ.5)GO TO 7
56	IF(RZ.EQ.2)GO TO 7
63	IF(RZ.EQ.6)GO TO 7
58	IF(RZ.EQ.3)GO TO 7
53	IF(RZ.NE.0)GO TO 4
	
7	IF(A.EQ.0)GO TO 402
	IF(A.EQ.3)GO TO 402
C  CHNG NO ACCI OR NAT TO SHARP
	IF(A.EQ.4)GO TO 401
C 4=bb   5=##
	IF(A.EQ.2)GO TO 405
30	ADD=CHNAT
C  MAKE IT NAT. IF NEEDED
3	Q(J+5)=R5-A+ADD
4	PRX=RX
C  REAL NOTE LEVEL
	Q(J+4)=R+XRT
	BAR=0
100	IF(K.GE.JITEM)GO TO 499
	K=K+1
	GO TO 599


C NEXT FOR BSCLAR.---ADD OTHERS HERE!!!
64	IF(CLEF.EQ.1)XRT=XRT-12
	GO TO 58

101	IF(A.EQ.0)GO TO 401
	IF(A.EQ.2)GO TO 30
	IF(A.EQ.3)GO TO 401
	IF(A.EQ.5)GO TO 402
C  WON'T HANDLE Gbb→Ab
404	ADD=4
	GO TO 3
401	ADD=1
	GO TO 3

402	ADD=2
	GO TO 3
405	ADD=5
	GO TO 3
499	KW=KW+1
	IF(RSIG)GO TO 498
	IF(IADD.EQ.0)GO TO 498
	M=ITOT-1
C INSERT NEW KSIG
	Q(M)=4
	Q(M+1)=17
	Q(M+2)=SN
	Q(M+3)=9 
	Q(M+4)=0 
	Q(M+5)=IADD
	Q(M+6)=CLEF
	ITOT=ITOT+7
	JITEM=JITEM+1
	KPN(JITEM)=ITOT+1
498	IF(KW.LT.JPG)GO TO 199
	CALL RVRS(JITEM)
C  TO REVERSE STEMS, BEAMS AND SLURS
497	DO 496 K=1,ITEM-1
C THIS REORDERS PTR ARRAY
	IF(KPN(K).LT.KPN(K+1))GO TO 496
	CALL EXCH(KPN(K),KPN(K+1))
	GO TO 497
496	CONTINUE
	CALL PUTEXT(NOUT,XOUT)
	ITEM=JITEM+2
	CALL EXTOUT(JST,128)
	CALL EXTOUT(KPN,ITEM)
	CALL EXTOUT(Q,ITOT)
	CALL FINEXT
	TYPE 2201,NOUT,XOUT
	NOUT=NOUT+2
	NM=NM+2
	GO TO 10
	END



	SUBROUTINE RVRS(LEND)
	COMMON /PX/KPN(1) /Q/Q(1)
 	1 /XXX/IRV,ITRANS,JPG
	DATA RSTEM/6.5/
	KW=0
	IRV=0
	IF(ITRANS.LT.10)GO TO 100
	IF(ITRANS.NE.18)IRV=-1
C TRNS ↓ + STEM ↑ = NO CHNG, TRNS ↑ +STEM ↓ = NO CHNG
100	K=1
	SN=KW
	DO 30 N=1,LEND
	IF(CODEN(KPN,N,Q,J).NE.1)GO TO 30
C LOOK FOR NOTES WITH STEM BUT NO RHYTH. VALUE
	IF(Q(J+2).NE.SN)GO TO 30
C ON THIS STAFF?
	IF(Q(J).LT.7)GO TO 31
	IF(Q(J+9).NE.0)GO TO 30
31	IF(Q(J+5).GE.10)GO TO 102
C FOUND A 0 RHYTHM WITH A STEM - IGNORE THIS STAFF
30	CONTINUE

1	R=CODEN(KPN,K,Q,J)
	IF(Q(J+2).NE.SN)GO TO 10
CHECK ON STAFF NUM.
	IF(R.NE.1)GO TO 2
C  JUMP IF NOT A NOTE
	IF(NORVRS(Q(J+5)))GO TO 10
CHECKS STEM DIR. AND TRNS DIR.
	IF(Q(J+5).LT.10)GO TO 10
C  JUMP IF NO STEM ON IT
	KK=K+1
3	IF(KK.GT.LEND)GO TO 102
CC3	IF(KK.GT.LEND)RETURN
	RR=CODEN(KPN,KK,Q,JJ)
	IF(Q(JJ+2).EQ.SN)GO TO 101
	GO TO 7
101	IF(RR.NE.1)GO TO 5
C  JUMP IF NOT A NOTE
	IF(Q(JJ+5).GE.10)GO TO 6
C SKIP CHORD NOTES (NO STEM)
7	KK=KK+1
	GO TO 3
C DID NOT FIND BEAM NEARBY
6	RZ=AMOD(Q(J+4),100.0)
	N=J+5
	A=10
	IF(RZ.GE.7)GO TO 60
	IF(Q(N).LT.20)GO TO 10
C NOW STEM SHOULD BE DOWN IF WITHOUT BEAM OR 1ST NT UNDER BEAM.
	A=-A
	GO TO 15
60	IF(Q(N).GE.20)GO TO 10
C  THERE MUST BE A BETTER WAY!
15	Q(N)=Q(N)+A
	GO TO 10
CCCCC8	IF(Q(N).LT.20)GO TO 10
CCCCC	A=-A
C  STEM UP
CCCCC	GO TO 15
5	IF(RR.NE.6)GO TO 6
20	B=Q(JJ+4)
	C=Q(JJ+5)
	D=(B+C)/2.
	IF(RR.EQ.5)GO TO 9
	IF(RR.NE.6)GO TO 10
	B=Q(JJ+6)+.5
C  SAVES RANGE OF BEAM +1.
	IF(Q(JJ+7).GE.20)GO TO 11
C  NOW STEMS ARE UP
	IF(D.LT.RSTEM)GO TO 12
C JUMP TO 12 IF ALL OK
CC	C=-10
	JSTM=0 
C SAVE FOR REVERSED STEMS
	GO TO 23
11	IF(D.GE.RSTEM)GO TO 12
C  STEMS DOWN
C JUMP IF NO REVERSE NEEDED
	JSTM=-1
23	JH=0
	CHNG=0
CC	DO 16 N=K,LEND
	N=K
164	R=CODEN(KPN,N,Q,KK)
	IF(Q(KK+2).NE.SN)GO TO 16
	IF(Q(KK+3).GT.B)GO TO 140
	IF(R.NE.1)GO TO 17
	L=5+KK
	IF(Q(L).LT.10)GO TO 16
C  PASS NOTES WITH NO STEM
	R=Q(KK+8)
C  THE STEM LENGTH
	IF(R.EQ.999)R=0
	Q(KK+8)=-R
C  FOR THE INVERSION
19	BC=10.
	A=Q(L)
	IF(A.GE.20)BC=-BC
	Q(L)=BC+A
	IF(JH.NE.0)GO TO 161
C NEXT FOR 1ST NOTE UNDER BEAM
	JH=4
160	R=Q(JJ+JH)-Q(KK+4)
	A=-1 
	IF(JSTM)GO TO 163
	A=R
	R=1
C NOW STEMS UP
163	IF(R.GT.A)GO TO 162
C JUMP IF BEAM IS NOT TOO CLOSE TO NOTE
	CHNG=A-R
	IF(JSTM.EQ.0)CHNG=-CHNG
CCC	JH=JJ+4
CCC	Q(JH)=Q(JH)+CHNG
CCC	JH=JH+1
CCC	Q(JH)=Q(JH)+CHNG
162	IF(L)GO TO 141
C  FOR ESCAPE FROM LOOP
161	JH=KK
C  JH SAVES PTR TO LAST NOTE UNDER BEAM
	GO TO 16
17	IF(R.NE.6)GO TO 18
C NOW IT'S A BEAM
	L=7+KK
	GO TO 19
18	IF(R.NE.5)GO TO 16
C NOW IT'S A SLUR
	C=-4
	IF(Q(KK+7))C=-C
	CALL SLRV(KK,C)
C  TO REVERSE SLUR
CC	Q(KK+7)=-Q(KK+7)
16	N=N+1
	IF(N.LE.LEND)GO TO 164
C  SHOULD ALWAYS EXIT FROM LOOP BEFORE END OF ARRAY!
140	KK=JH
	L=-1
	JH=5
C GO BACK TO CHECK HGT OF LAST NOTE AND RIGHT END OF BEAM
	GO TO 160

141	IF(CHNG.EQ.0)GO TO 14
	C=CHNG
	IF(CHNG)CHNG=-CHNG
	DO 142 N=K,LEND
C  TO READJUST STEMS UNDER REVERSED BEAMS
	R=CODEN(KPN,N,Q,KK)
	IF(Q(KK+2).NE.SN)GO TO 142
	IF(Q(KK+3).GT.B)GO TO 14
	IF(R.NE.1)GO TO 242
	Q(KK+8)=Q(KK+8)+CHNG
C  THE STEM LENGTH
	GO TO 142
242	IF(R.NE.6)GO TO 142
	Q(KK+4)=Q(KK+4)+C
	Q(KK+5)=Q(KK+5)+C
CC	Q(KK+7)=Q(KK+7)+BC  
142	CONTINUE
	GO TO 14

C NEXT FOR SLURS
9	B=-4
	IF(Q(JJ+7))GO TO 24
	IF(D.GT.RSTEM)GO TO 10
C JUMP TO LEAVE STEM UP
	GO TO 25
24	IF(D.LT.5)GO TO 10
C JUMP TO LEAVE STEM DOWN
	B=-B
CC25	Q(JJ+4)=Q(JJ+4)+B
CC	Q(JJ+5)=Q(JJ+5)+B
CC	Q(JJ+7)=-R
25	CALL SLRV(JJ,B)
	GO TO 10
12	DO 13 N=K+1,LEND
	KK=KPN(N)
	IF(Q(KK+2).NE.SN)GO TO 13
C  IS THIS NEEDED↑↑↑↑??
	IF(Q(KK+3).GT.B)GO TO 14
13	CONTINUE
C  JUMP OUT WHEN PAST END OF BEAM.
14	IF(N.GT.K)K=N-1
C          ↑↑↑↑↑↑   WHY????????????
	GO TO 10

2	IF(R.NE.6)GO TO 21
	IF(NORVRS(Q(J+7)))GO TO 10
22	JJ=J
	RR=R
	GO TO 20
21	IF(R.NE.5)GO TO 10
	RR=20
	IF(Q(J+7))RR=10
	IF(NORVRS(RR).GE.0)GO TO 22
10	IF(K.GT.LEND)GO TO 102
CC10	IF(K.GT.LEND)RETURN
	K=K+1
	GO TO 1
102	KW=KW+1
	IF(KW.LT.JPG)GO TO 100
	END

	FUNCTION NORVRS(R)
	COMMON  /XXX/IRV,ITRANS,JPG
	NORVRS=0
	IF(R.LT.20)GO TO 1
C NOW STEM UP
	IF(IRV)RETURN
2	NORVRS=-1
	RETURN
1	IF(IRV)GO TO 2
	END